/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include	"config.h"
#include	"gpio.h"
#include	"timer.h"
#include	"UART.h"
#include	"delay.h"
#include "ES1642.h"
/*************	功能说明	**************

基于STC8G1K08A为主控芯片进行编写测试

串口中断方式接收协议通讯程序。


通过开启 UART.h 头文件里面的 UART1~UART4 定义，启动不同通道的串口通信。

用定时器做波特率发生器，建议使用1T模式(除非低波特率用12T)，并选择可被波特率整除的时钟频率，以提高精度。

下载时, 选择时钟 24 MHz (用户可在"config.h"修改频率).

******************************************/
#define data_length 2
#define buff_length 17+data_length
#define HEARTBEAT_PERIOD 50 // 心跳包发送周期
#define STABLE_COMM_TIME_MS 1000   // 通信稳定时间，单位毫秒
#define COMM_TIMEOUT_MS  150    // 通信超时时间(毫秒)
#define LED_BLINK_PERIOD_MS 500    // LED闪烁周期(毫秒)
// 状态定义
typedef enum {
	STATE_IDLE,          // 未通信未通电
	STATE_COMM_ACTIVE,   // 已通信未通电
	STATE_POWER_ON       // 已通信已通电
} DeviceState;


/*************	本地常量声明	**************/


/*************	本地变量声明	**************/
u8  xdata   tmp[buff_length] = {0x79,0x0C,0x00,0x58,0x14,0x44,0x10,0xF9,0x30,0x50,0x68,0x00,0x53,0x02,0x00,0x03,0x04,0x09,0xB3};
/*				  发送数据		 79H [Data]长度 Ctrl Cmd [RSV  深度 {        Dst Addr            } DataLen  User Data] SUM XOR*/
u8 xdata ES1642_frame[32];
u8 frame_length;
u8 src_addr[6];
u8 user_data[4];
u16 user_data_len;
u8 chargeState = 0;
u8 ledState = 0;
int i;
int test_cnt = 0;
int result = 0;
/*************	本地函数声明	**************/

/**********************************************/
void main(void)
{
	GPIO_config();
	Timer_config();
	UART_config();
	EA = 1;
	SWITCH_OFF;
	LED_ON;

	frame_length = build_data_frame(broadcast_addr,heartTxData,sizeof(heartTxData),1,ES1642_frame,sizeof(ES1642_frame));
	
	
	while (1)
	{	

		
	}
}
/********************* 中断处理************************/
/*

*/
/*************  Timer0中断函数 周期1ms*****************/
void Timer0_Isr(void) interrupt TIMER0_VECTOR
{
	static DeviceState state = STATE_IDLE; // 初始状态为未通信未通电
	static u16 comm_timeout ;
	static u16 stable_comm_cnt = 0;  // 通信稳定计时器，单位毫秒
	static u16 heart_cnt = 0;
	static u16 ledPeriod; // LED闪烁周期，单位为毫秒

	if(++heart_cnt >= HEARTBEAT_PERIOD){
		heart_cnt = 0;
		for( i=0; i<frame_length; i++) TX1_write2buff(ES1642_frame[i]);
	}
	
	if(COM1.RX_TimeOut > 0)		//超时计数默认接收完成
	{
		if(--COM1.RX_TimeOut == 0)//每毫秒减1
		{
			if(COM1.RX_Cnt > 0)
			{
			    result = parse_received_data_frame(
					RX1_Buffer,
					src_addr,
					user_data,
					sizeof(user_data),
					&user_data_len);		
				if (result == 0 && user_data[0]==0xEE) { // 收到有效数据包
					comm_timeout = COMM_TIMEOUT_MS; // 重置通信超时计时器
                    if(state == STATE_IDLE) {
						// 状态切换：IDLE -> COMM_ACTIVE
						state = STATE_COMM_ACTIVE;
						stable_comm_cnt = 0;   // 开始稳定计时
                    }
				}
			}
			COM1.RX_Cnt = 0;
		}
	}
	// 状态机处理
    switch(state) {
        case STATE_IDLE:
            SWITCH_OFF;
            LED_ON;  // 常亮表示待机状态
            break;
            
        case STATE_COMM_ACTIVE:
            SWITCH_OFF;
            stable_comm_cnt++;// 更新稳定计时器

            // 达到稳定要求才通电
            if(stable_comm_cnt >= STABLE_COMM_TIME_MS) {
                // 状态切换：COMM_ACTIVE -> POWER_ON
                state = STATE_POWER_ON;
				LED_TOGGLE;
                ledPeriod = LED_BLINK_PERIOD_MS; // 初始化LED闪烁周期
            }
			
            // 检查通信超时
            if(--comm_timeout == 0) {
                // 状态切换：COMM_ACTIVE -> IDLE 
                state = STATE_IDLE;
            }
            break;
            
        case STATE_POWER_ON:
            SWITCH_ON;
            // LED闪烁处理
            if(--ledPeriod == 0) {
                LED_TOGGLE;
                ledPeriod = LED_BLINK_PERIOD_MS;
            }
            
            // 检查通信超时
            if(--comm_timeout == 0) {
                // 状态切换：POWER_ON -> IDLE 
                state = STATE_IDLE;
                SWITCH_OFF;
                LED_ON;  // 回到待机状态
            }
            break;

		default:
			// 未知状态，回到初始状态
			state = STATE_IDLE;
			SWITCH_OFF;
			LED_ON;
			break;
    }
}
void UART1_int (void) interrupt UART1_VECTOR
{
	if(RI)
	{
		RI = 0;
		if(COM1.B_RX_OK == 0)
		{
			if(COM1.RX_Cnt >= COM_RX1_Lenth)	COM1.RX_Cnt = 0;
			RX1_Buffer[COM1.RX_Cnt++] = SBUF;
			COM1.RX_TimeOut = TimeOutSet1;
		}
	}
	if(TI)
	{
		TI = 0;
		if(COM1.TX_read != COM1.TX_write)
		{
			ACC = TX1_Buffer[COM1.TX_read];
			TB8 = P;
		 	SBUF = TX1_Buffer[COM1.TX_read];
			if(++COM1.TX_read >= COM_TX1_Lenth)		COM1.TX_read = 0;
		}
		else	COM1.B_TX_busy = 0;
	}
}



